package com.lnsoft.cac.server.handle.codec.frameMessage;


import io.netty.buffer.ByteBuf;
import io.netty.buffer.Unpooled;
import lombok.Data;
import lombok.NonNull;

@Data
/**
 * 事件信息上送
 * */
public class EventUpload_Msg {
    private int Measure_Point_ID;           //1byte     监测点号
    private int StatTime;                   //4byte     采集时间（采用世纪秒表示）
    /**
     * 0x01：停电，事件描述信息为停电时间和停电时当前电压分钟平均值，时间，采用世纪秒表示；
     * 0x02：上电，事件描述信息为上电时间和上电时当前电压分钟平均值，时间采用世纪秒表示；
     * 0x03：越上限，事件描述信息为越上限时当前电压分钟平均值；
     * 0x04：越上限恢复，事件描述信息为越上限恢复时当前电压分钟平均值；
     * 0x05：越下限，事件描述信息为越下限时当前电压分钟平均值；
     * 0x06：越下限恢复，事件描述信息为越下限恢复时当前电压分钟平均值；
     * 0x07：复位，事件描述信息为装置复位时间，采用世纪秒表示；
     * 0x08：其他，采用字符串描述。
     * */
    private int Fault_Type;                 //1byte
    private byte[] Fault_Desc;              // <110 byte        返回装置事件描述信息（由厂家自定义并以字符串方式描述，中文采用UTF-8编码）


    public ByteBuf toByteBuf() throws Exception{
        if (!Util.measurePointIDIsAvailable(Measure_Point_ID)) {
            throw new Exception("监测点号 设置异常");
        }
        if (!Util.statTimeIsAvailable(StatTime)) {
            throw new Exception("采集时间 设置异常");
        }
        if (Fault_Desc == null) {
            Fault_Desc = new byte[109];
        }
        if (Fault_Desc.length > 109) {
            throw new Exception("返回装置事件描述信息  设置异常");
        }
        ByteBuf bf = Unpooled.buffer(115);
        bf.writeByte(Measure_Point_ID);
        bf.writeIntLE(StatTime);
        bf.writeByte(Fault_Type);
        bf.writeBytes(Fault_Desc);
        return bf;
    }


    //  解析 [事件信息上送] 帧报文内容区 到消息体中
    public static EventUpload_Msg decFrameBody(@NonNull byte[] frameBody) throws Exception {
        ByteBuf bf = Unpooled.wrappedBuffer(frameBody);
        EventUpload_Msg msg = new EventUpload_Msg();
        int len = frameBody.length;
        if (len == 0) {
            return null;
        }
        if (116 < len) {
            throw new Exception("frameBody 数据异常");
        }
        msg.setMeasure_Point_ID(bf.getByte(0) & 0xFF);
        msg.setStatTime(bf.getIntLE(1) & 0xFFFFFFFF);
        msg.setFault_Type(bf.getByte(5) & 0xFF);
        byte[] Fault_Desc = new byte[len - 6];
        bf.getBytes(6, Fault_Desc, 0, len - 6);
        return msg;
    }

}
